#include <stdio.h>
#include <stdlib.h>

int main()
{
#if 0
    //堆上的空间由开发进行申请，由开发进行释放
    int *a = (int*)malloc(4);   //malloc函数申请堆上空间4个字节，申请成功以后返回一个void*型的指针，然后这个void*型的指针被强转成int*型的指针，给到指针a   
    //返回值是万能指针，使用时可以强转成想要的指针类型，申请单位是字节
    //malloc函数申请堆上空间不一定每次都成功（比如堆上空间被用完，或内存出现错误了）
    //如果malloc申请空间失败，返回空指针
    if(a == NULL)
    {
        printf("申请空间失败！\n");
        return -1;
    }

    *a = 10;
    printf("%d\n", *a);

    free(a);    //申请的堆上空间要进行释放，否则积累多了会导致内存泄漏
#endif

#if 0
    //申请一维数组
    //申请10个int
    int *a = (int*)malloc(sizeof(int) * 10);
    if(a == NULL)
    {
        printf("申请空间失败！\n");
        return -1;
    }

    for(int i = 0; i < 10; i++)
    {
        a[i] = i + 1;
    }

    for(int i = 0; i < 10; i++)
    {
        printf("%d", a[i]);
    }
    printf("\n");

    free(a);
#endif

#if 1
    //申请二维数组（2行3列）
    int **a = (int **)malloc(sizeof(int*) * 2); //万能指针几级都能转（int * *a）
    if(a == NULL)
    {
        printf("申请空间失败！\n");
        return -1;
    }

    //遍历指针数组
    for(int i = 0; i < 2; i++)
    {
        a[i] = (int*)malloc(sizeof(int) * 3);
        if(a[i] == NULL)
        {
            printf("申请空间失败！\n");
            return -1;
        }
    }

    //给二维数组赋值
    for(int i = 0; i < 2; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            a[i][j] = i*3 + j+1;
        }
    }

    //打印二维数组
    for(int i = 0; i < 2; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }

    //释放的顺序和申请的顺序相反（先放里面的再放外面的）
    for(int i = 0; i < 2; i++)
    {
        free(a[i]);
    }

    free(a);

#endif

    return 0;
}